DIM SHARED a_can_do as c
DIM SHARED a_field_value as c

'***************************************************************************
'***************************************************************************
'*** PURPOSE:                                                            ***
'*** This script is used in the CAN_WRITE event of DATE type fields      ***
'*** to fix the y2k issue.  A5 will correctly save all dates as 4 digits ***
'*** but, if a year is input as only 2 digits, it will try to convert it ***
'*** to the 20th century.                                                ***
'*** This script allows two options which must be selected in the        ***
'*** script itself by the programmer: (see Routines 1 and 2 below)       ***
'***   1. (default ) All 2 digit dates default to the nearest year to    ***
'***      the current year.  (eg: 50 years from current)                ***
'***   2. All 2 digit dates default to the current century.              ***
'***      (eg: 90 = 1990 during 1999  -BUT-  90 = 2090 during 2000       ***
'***                                                                     ***
'***   WRITTEN BY:  Cal Locklin (CALocklin@aol.com); Aug. 1997           ***
'***      for Alpha Five version 1.02                                    ***
'***   LAST UPDATE:  Nov 14, 1998                                        ***
'***************************************************************************
'***************************************************************************
'*** HOW TO USE THIS SCRIPT:
'*** 	1. Save a copy of this script in the database being used.
'***   2. In the field rules for each DATE field, put this script in the
'***      Can_write_field event.
'***************************************************************************
'***************************************************************************

'*** 3 CHAR INPUT OR LESS:  (01/)
'-----------------------------------------------------------------
'--- IF THE USER INPUT LESS THAN 4 CHARACTERS, THEN THE DATE
'--- INPUT IS NOT COMPLETE.  LET THE SYSTEM HANDLE IT.
'--- ACTUALLY, THIS ROUTINE SHOULD BE REDUNDANT, THE SYSTEM
'--- SHOULD DETECT THIS PROBLEM BEFORE THE y2k_fix FUNCTION BEGINS.
'--- THIS IS ONLY INCLUDED AS A SAFETY VALVE.
'-----------------------------------------------------------------
IF len( trim( a_field_value )) < 4
	a_field_value = a_field_value
	END
END IF

'*** 4 CHAR INPUT: (01/1)
'-----------------------------------------------------------------
'--- IF THE USER HAS NOT PUT A ZERO IN FRONT OF A DAY, ADD IT.
'--- 	EXAMPLE:  THE USER INPUT "03/8" INSTEAD OF "03/08"
'--- NOTE:  THIS IS NOT PART OF THE y2k FIX.  IT IS A "BONUS" FIX.
'-----------------------------------------------------------------
IF len( trim( a_field_value )) = 4
	a_field_value = stuff( a_field_value, 4, 0, "0")
	a_field_value = a_field_value + "/"
	'--- LENGTH OF a_field_value NOW EQUALS 6 SO IT WILL BE CHANGED AGAIN BELOW.
END IF

'*** 5 CHAR INPUT:  (01/01)
'-----------------------------------------------------------------
'NOTE:  IT IS IMPOSSIBLE TO INPUT ONLY 5 CHARACTERS.  AS SOON AS THE 
'--- FIFTH CHARACTER IS TYPED, THE A5 FUNCTION ADDS THE "/" CHARACTER.
'-----------------------------------------------------------------

'*** 6 CHAR INPUT:  (01/01/)
'********************************************************************
'*** NOTE: **********************************************************
'********************************************************************
'*** THE FOLLOWING 2 CHOICES (=6, >8) ARE SEPARATED HERE SO THE "=6" 
'*** VERSION CAN BE MODIFIED TO CREATE AN OUTPUT STRING THAT ALWAYS
'*** INCLUDES THE FULL YEAR.  BY DOING THIS HERE, IT IS NOT NECESSARY
'*** TO USE A SEPARATE LINE WITH "dtoc(ctod(...))" IN THE CALLING
'*** SCRIPT IN ORDER TO PASS/VIEW/ETC.
'********************************************************************
'*** ACTUALLY, THIS HAS LITTLE VALUE IN THIS SCRIPT.  IT IS MORE 
'*** USEFUL IN THE Func_y2k SCRIPT FOR ui_get_date CORRECTIONS.
'*** I DID IT THE SAME IN BOTH FOR CONSISTENCY.
'********************************************************************

'-----------------------------------------------------------------
'--- IF THE USER HAS NOT PUT IN ANY YEAR, MAKE Year = Current_Year.
'-----------------------------------------------------------------
IF len( trim( a_field_value )) = 6
	a_field_value = a_field_value + cyear( DATE())
	goto Check_leap_year
END IF

'*** 9 or 10 CHAR INPUT:  (01/01/100) or (01/01/1997)
'-----------------------------------------------------------------
'--- IF THE USER HAS INPUT A FULL DATE, INCLUDING CENTURY AND YEAR,
'--- DON'T CHANGE IT.
'--- CATCH 22:  ANY DATE PRIOR TO CENTURY 100 CANNOT BE SAVED. THIS
'---            IS THE WAY A5 HAS ALWAYS BEEN.  (EVEN "0095" = "1995")
'-----------------------------------------------------------------
IF len( trim( a_field_value )) > 8
	goto Check_leap_year
END IF

'******   	EVERYTHING BETWEEN HERE AND THE 'Check_leap_year' LABEL
'******   ASSUMES ONLY A 1 OR 2 DIGIT YEAR HAS BEEN INPUT.

'*** 7 OR 8 CHAR INPUT:  (CHARS 7 & 8 ARE THE YEAR)
'-----------------------------------------------------------------
'--- DETERMINE THE CURRENT CENTURY and YEAR BASED ON SYSTEM DATE.
'--- THIS ASSUMES THAT THE COMPUTER'S SYSTEM DOES NOT HAVE ITS
'--- OWN YEAR y2k PROBLEM.
'-----------------------------------------------------------------
current_century_c = substr( dtoc( DATE()), 7, 2 )
current_century = val( current_century_c )
next_century_c = ltrim( str( current_century + 1 ))
last_century_c = ltrim( str( current_century - 1 ))

current_year_c = substr( dtoc( DATE()), 9, 2 )
current_year = val( current_year_c )

'-----------------------------------------------------------------
'--- DETERMINE THE 2 DIGIT YEAR THAT WAS INPUT.
'-----------------------------------------------------------------
input_year_c = substr( a_field_value, 7, 2 )
	'-----------------------------------------------------------------
	'--- THIS IS BONUS FIX #2 - IT ALLOWS THE USER TO INPUT THE
	'--- YEAR AS ONE DIGIT.  THIS SEEMS LIKE A LOGICAL THING TO ME FOR 
	'--- YEARS 2000 - 2009 BUT NOBODY ELSE SEEMS TO HAVE CONSIDERED IT.
	'-----------------------------------------------------------------
	IF len( trim( input_year_c )) = 1
		input_year_c = "0" + input_year_c
	END IF
input_year = val( input_year_c )

'-----------------------------------------------------------------
'  FIRST SET A "TEST" VALUE FOR date_c SO WE CAN CHECK TO BE SURE
'  ONLY ONE OPTION IS CHOSEN BELOW.  (BY THE PROGRAMMER - NOT USER.)
'  date_c IS CHANGED WHENEVER A CORRECT DATE STRING IS ACHIEVED.
'-----------------------------------------------------------------
date_c = "start"	

'*****************************************************************
'*************  NOTE  NOTE  NOTE  NOTE  **************************
'*****************************************************************
'*** CHOOSE ONE OF THE TWO FOLLOWING ROUTINES BY REMMING OUT (')
'*** THE ONE YOU  DON'T  WANT
'*****************************************************************
'*****************************************************************

'*********  ROUTINE #1: ********* +/- 50 Years *******************
'-----------------------------------------------------------------
'--- SINCE WE KNOW THE USER HAS INPUT EITHER NO YEAR OR ONLY THE
'--- LAST ONE OR TWO DIGITS OF THE YEAR, SET THE YEAR BASED ON A
'--- +/-50 YEAR RANGE.
'-----------------------------------------------------------------
SELECT
CASE current_year < 50 .and. input_year > current_year + 49
	year_c = last_century_c + input_year_c
	date_c = left( a_field_value, 6) + year_c
CASE current_year > 50 .and. input_year < current_year - 50
	year_c = next_century_c + input_year_c
	date_c = left( a_field_value, 6) + year_c
CASE ELSE
	year_c = current_century_c + input_year_c
	date_c = left( a_field_value, 6) + year_c
END SELECT

'*********  ROUTINE #2: ********* Century = Current Century ******
'-----------------------------------------------------------------
'--- SINCE WE KNOW THE USER HAS INPUT EITHER NO YEAR OR ONLY THE
'--- LAST ONE OR TWO DIGITS OF THE YEAR, MAKE SURE THE CENTURY IS
'--- THE SAME AS THE CURRENT CENTURY.
'-----------------------------------------------------------------
'	IF date_c <> "start"
'		ui_beep()
'		ui_msg_box( "**** ERROR ****", "You have not remmed out the first y2k option.  You must go into the script and 'rem out' the option you DON'T want to use.", 16 )
'		END
'	END IF
'date_c = left( a_field_value, 6 ) + current_century_c + input_year_c

'*********************************************************************
'*********************************************************************
'***** ---------------------------------------------------- **********
'***** |   END OF ROUTINES ***********  END OF ROUTINES   | **********
'***** ---------------------------------------------------- **********
'*********************************************************************
'*********************************************************************

'-----------------------------------------------------------------
'--- NOW RESET THE INPUT VALUE TO THE CORRECT DATE
'-----------------------------------------------------------------
a_field_value = date_c

Check_leap_year:

'****************************************************************************
'*** NOTE: ******* BONUS FIX #3 *********************************************
'****************************************************************************
'***  THE NEXT PART OF THIS SCRIPT FIXES A SMALL 'GLITCH' IN THE A5 DATES.
'***  A5 CONVERTS 02/29/xx TO 03/01/xx IF "xx" IS NOT A LEAP YEAR.
'***  THIS CAN BE A PROBLEM IF YOU THINK YOU ARE GETTING, FOR EXAMPLE, A 
'***  REPORT FOR ONLY THE MONTH OF FEBRUARY - INSTEAD, IT WILL INCLUDE THE 
'***  FIRST DAY OF MARCH ALSO.
'****************************************************************************
'****************************************************************************

'----------------------------------------------------------------------------
'--- IF DATE ISN'T 02/29, EVERYTHING IS OK - STOP IMMEDIATELY.
'----------------------------------------------------------------------------
IF left( a_field_value, 6 ) <> "02/29/"
	END
END IF

'----------------------------------------------------------------------------
'--- I USE substr HERE FOR THE BENEFIT OF ANY HISTORIANS OUT THERE.  DATES 
'--- BETWEEN 100 AND 999 WILL BE CHECKED THIS WAY.  DATES BETWEEN 0 AND 99
'--- ARE NOT POSSIBLE BECAUSE THEY ARE TREATED LIKE 2 DIGITS YEARS.
'--- NOTE: SINCE THE CALENDAR CHANGED IN 1752 IT REALLY ISN'T ACCURATE ANYWAY.
'----------------------------------------------------------------------------
year_test = val( substr( a_field_value, 7, 4 ))

test = "BAD"
'----------------------------------------------------------------------------
'--- IF IT IS A LEAP YEAR, CHANGE test TO "OK".  CHECK CENTURIES, TOO.
'----------------------------------------------------------------------------
IF mod( year_test, 4) = 0
	IF mod( year_test, 100 ) = 0
		IF mod( year_test, 400 ) = 0
			test = "OK"
		END IF
	ELSE
		test = "OK"
	END IF
END IF

IF test = "BAD"
	response = ui_msg_box( "*** WARNING ***", "You have input February 29th for a year that is not a leap year.  Click YES to change it to March 1.  Click NO to change it to Feb. 28.", 4+32 )
	'--- THE "dtoc(ctod(..))" USED BELOW SEEMS REDUNDANT BUT IT IS USED BECAUSE 
	'--- THE DATE MAY HAVE BEEN INPUT WITHOUT THE YEARS AND I WANT ALL OUTPUT
	'--- FROM THIS ROUTINE TO HAVE THE FULL 10 CHARACTER DATE.
	IF response = 6
		'--- CHANGE THE DATE STRING TO MATCH THE DESIRED DATE.  (MARCH 1)
		date_c = dtoc( ctod( date_c ))
		a_field_value = date_c
	ELSE
		'--- CHANGE THE DATE STRING TO MATCH THE DESIRED DATE.  (FEB. 28)
		date_c = dtoc( ctod( date_c ) - 1 )
		a_field_value = date_c
	END IF
END IF

END